package cn.org.xuanguang.kepler.hormos.spring.starter;

import cn.org.xuanguang.kepler.hormos.rdb.executor.JdbcSyncSqlExecutor;
import cn.org.xuanguang.kepler.hormos.rdb.executor.SyncSqlExecutor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.SneakyThrows;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * 驱动类，实际加载驱动类，加载执行器，数据源等信息
 */
@Getter
@Setter
@Builder
public class HormosManager {
    /**
     * 设计一套属性信息，用于存储Hormos框架的运行环境配置信息。
     */
    private HormosOptions hormosOptions;
    /**
     * 执行器
     */
    private SyncSqlExecutor syncSqlExecutor;
    /**
     * 数据源
     */
    private DataSource dataSource;


    /**
     * HormosManager的构造函数。
     * 用于初始化HormosManager实例，配置Hormos框架的基本运行环境和数据源。
     *
     * @param hormosOptions   Hormos配置选项，包含了框架运行所需的配置信息。
     * @param syncSqlExecutor 同步SQL执行器，用于执行数据库操作的SQL语句。
     * @param dataSource      数据源，提供了数据库连接的管理。
     */
    @SneakyThrows
    public HormosManager(HormosOptions hormosOptions, SyncSqlExecutor syncSqlExecutor, DataSource dataSource) {
        this.hormosOptions = hormosOptions;
        this.syncSqlExecutor = syncSqlExecutor;
        this.dataSource = dataSource;
    }

    @SneakyThrows
    public HormosManager(HormosOptions hormosOptions, DataSource dataSource) throws SQLException {
        //加载默认的执行器
        this(hormosOptions, new JdbcSyncSqlExecutor(dataSource, hormosOptions.getDialect()), dataSource);
    }

    /**
     * HormosManager的构造函数。
     * 用于初始化HormosManager实例，配置Hormos框架的基本运行环境和数据源。
     *
     * @param hormosOptions Hormos配置选项，包含了框架运行所需的配置信息。
     */
    @SneakyThrows
    public HormosManager(HormosOptions hormosOptions) throws SQLException {
        this(hormosOptions, HormosDataSourceManager.getDataSource(hormosOptions.getDsId()));
    }

}
